#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW 0
#define ElemType int
#define Status int
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
//顺序表的存储结构
typedef struct {
    ElemType *elem;
    int length;
    int listsize;
}SqList;

//初始化
Status InitList_Sq(SqList *L) {
    //为顺序表分配初始存储空间
    L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    //判断存储空间是否分配成功
    if(!L->elem){
        return OVERFLOW;
    }
    //初始化顺序表长度为0
    L->length = 0;
    //初始化顺序表最大存储容量为LIST_INIT_SIZE
    L->listsize = LIST_INIT_SIZE;
    return OK;
}
//插入
Status ListInsert_Sq(SqList *L,int i,ElemType e){
    //判断i是否合法
    if(i<1 || i>L->length+1){
        return ERROR;
    }
    //判断存储空间是否已满
    if((L->length >= L->listsize)){
        ElemType *newelem= (ElemType *)realloc(L->elem,(L->length+ LISTINCREMENT) * sizeof(ElemType));
        if(L->elem==NULL){
            exit(ERROR);
        }
        //将新的存储空间地址赋给L->elem
        L->elem = newelem;
        //更新L->listsize
        L->listsize += LISTINCREMENT;
    }
    //找到插入位置的指针q
    ElemType *q = &(L->elem[i-1]);
    //从最后一个元素开始，依次后移一位（保证数据不丢失）
    for(ElemType *p = &(L->elem[L->length-1]);p>=q;p--){
        *(p+1) = *p;
    }
    //将新元素e插入到q所指向的位置
    *q = e;
    //链表长度加一
    L->length++;
    return OK;
}
//删除
Status ListDelete_Sq(SqList *L,int i){
    //判断i是否合法
    if(i<1 || i>L->length+1){
        return ERROR;
    }
    //从删除位置开始，依次前移一位（保证数据不丢失）
    for(ElemType *p = &(L->elem[i]);p<=L -> elem + L->length-1;p++){
        *(p-1) = *p;
    }
    //链表长度减一
    L->length--;
    return OK;
}
//查找
ElemType GetElem_Sq(SqList *L,int i,ElemType e){
    //判断i是否合法
    if(i<1 || i>L->length+1){
        return ERROR;
    }
    //找到查找位置的指针 将查找位置的元素赋给e
    e =L->elem[i-1];
    
    return e;
}
//修改
Status SetElem_Sq(SqList *L,int i,ElemType e){
     //判断i是否合法
    if(i<1 || i>L->length+1){
        return ERROR;
    }
    //找到修改位置的指针 将修改位置的元素赋值为e
    L->elem[i-1] = e;
    return OK;
}
//销毁
Status DestroyList_Sq(SqList *L){
    //
    if(L->elem==NULL){
        return ERROR;
    }
    //先清除数据，用calloc函数
    L->elem = (ElemType *)calloc(L->length,sizeof(ElemType));
    //再释放存储空间
    free(L->elem);
    return OK;
}
//打印
Status PrintList_Sq(SqList *L){
    //判断链表是否为空
    if(L->length==0){
        return ERROR;
    }
    //遍历链表
    for(int i=0;i<L->length;i++){
        printf("%d ",L->elem[i]);
    }
    printf("\n");
    return OK;
}
//主函数
int main(){
    SqList L;
    InitList_Sq(&L);
    ListInsert_Sq(&L,1,1);
    ListInsert_Sq(&L,2,2);
    ListInsert_Sq(&L,3,3);
    ListInsert_Sq(&L,4,4);
    ListInsert_Sq(&L,5,5);
    printf("=========PrintList_Sq=========\n");
    PrintList_Sq(&L);
    printf("\n");
    return 0;
}